package com.hxl.demo.tools;

import org.apache.tomcat.util.codec.binary.StringUtils;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Common {
    /**
     * 操作失败返回数据
     * @param msg 提示信息
     * @param code 状态码
     * @return
     */
    public static Object returnJsonFail(String msg,int code){

        HashMap<String,Object> result=new HashMap<String,Object>();
        result.put("msg",msg);
        result.put("code",code);
        return result;

    }
    /**
     * 操作成功返回数据
     * @param msg 提示信息
     * @param code 状态码
     * @param data 返回数据
     * @return
     */
    public static Object returnJsonSuccess(String msg,int code,Object data) {

        HashMap<String,Object> result=new HashMap<String,Object>();
        result.put("msg",msg);
        result.put("code",code);
        result.put("Data",data);

        return result;

    }
    /**
     * 操作成功返回数据(总条数和列表数据)
     * @param msg 提示信息
     * @param code 状态码
     * @param data 返回数据
     * @return
     */
    public static Object returnJsonList(String msg, int code, Object data, Integer total) {

        if(total==null || total<0){
            total=0;
        }
        HashMap<String,Object> result=new HashMap<String,Object>();
        result.put("msg",msg);
        result.put("code",code);
        result.put("total",total);
        result.put("data",data);

        return result;

    }
    /**
     * 判断对象中属性值是否全为空
     *
     * @param object
     * @return
     */
    public static boolean checkObjAllFieldsIsNull(Object object) {
        if (null == object) {
            return true;
        }

        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                f.setAccessible(true);

                System.out.print(f.getName() + ":");
                System.out.println(f.get(object));

//                if (f.get(object) != null && StringUtils.isNotBlank(f.get(object).toString())) {
////                    return false;
////                }
                if (f.get(object) == null){
                    return false;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }


        return true;
    }
    /*
    校验过程：
    1、从卡号最后一位数字开始，逆向将奇数位(1、3、5等等)相加。
    2、从卡号最后一位数字开始，逆向将偶数位数字，先乘以2（如果乘积为两位数，将个位十位数字相加，即将其减去9），再求和。
    3、将奇数位总和加上偶数位总和，结果应该可以被10整除。
    */
    /**
     * 校验银行卡卡号
     */
    public static boolean checkBankCard(String bankCard) {
        if(bankCard.length() < 15 || bankCard.length() > 19) {
            return false;
        }
        char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1));
        if(bit == 'N'){
            return false;
        }
        return bankCard.charAt(bankCard.length() - 1) == bit;
    }

    /**
     * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位
     * @param nonCheckCodeBankCard
     * @return
     */
    private static char getBankCardCheckCode(String nonCheckCodeBankCard){
        if(nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0
                || !nonCheckCodeBankCard.matches("\\d+")) {
            //如果传的不是数据返回N
            return 'N';
        }
        char[] chs = nonCheckCodeBankCard.trim().toCharArray();
        int luhmSum = 0;
        for(int i = chs.length - 1, j = 0; i >= 0; i--, j++) {
            int k = chs[i] - '0';
            if(j % 2 == 0) {
                k *= 2;
                k = k / 10 + k % 10;
            }
            luhmSum += k;
        }
        return (luhmSum % 10 == 0) ? '0' : (char)((10 - luhmSum % 10) + '0');
    }


    /**
     * 手机号验证
     * @param phone
     * @return
     *     中国电信号段 133、149、153、173、177、180、181、189、199
     *     中国联通号段 130、131、132、145、155、156、166、175、176、185、186
     *     中国移动号段 134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188、198
     *     其他号段
     * 14号段以前为上网卡专属号段，如中国联通的是145，中国移动的是147等等。
     *     虚拟运营商
     *     电信：1700、1701、1702
     *     移动：1703、1705、1706
     *     联通：1704、1707、1708、1709、171
     *     卫星通信：1349
     */
    public static boolean isPhone(String phone) {
        String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
        if (phone.length() != 11) {
            return false;
        } else {
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(phone);
            boolean isMatch = m.matches();
            if (!isMatch) {
                return false;
            }
            return true;
        }
    }
}
